<?php
/**
 * Класс для типов документов
 *
 * @package mumak
 * @subpackage core
 */
class RL_DocumentType
{
	
	/**
	 * Ссылка на RH
	 *
	 * @var RL_BasicRequestHandler
	 */
	public $rh;
	
	/**
	 * Контекст окружения
	 *
	 * @var RL_Context
	 */
	public $ctx;
	
	/**
	 * Тип документа
	 *
	 * @var RL_String
	 */
	public $type;
	
	/**
	 * Конфигурация типа документа
	 *
	 * @var RL_DocumentTypeConfig
	 */
	public $config;
	
	/**
	 * Набор возможных действий с конкретным типом документов (берется из конфигуратора)
	 *
	 * @var array
	 */
	public $actions = array();
	
	/**
	 * Набор возможных представлений для типа документов (берется из конфигуратора)
	 *
	 * @var array
	 */
	public $views = array();
	
	/**
	 * Родительский тип
	 *
	 * @var string
	 */
	public $parent_type = "";
	
	/**
	 * Флажок, показывающий, является ли тип абстрактным
	 *
	 * @var bool
	 */
	public $is_abstract;
	
	/**
	 * Человеческое название типа
	 *
	 * @var string
	 */
	public $title;
	
	/**
	 * Создает тип документа
	 *
	 * @param RL_BasicRequestHandler $rh
	 * @param string $document_type тип документа
	 * @param bool $no_load не грузить объект при создании
	 */
	public function __construct( RL_BasicRequestHandler $rh , $document_type , $no_load = false)
	{
		$this->rh = $rh;
		$this->ctx = $rh->ctx;
		
		$this->type = new RL_String( $document_type );
		$this->type->toLower();
		
		$this->rh->useClass("RL_DocumentTypeConfig");
		
		if($no_load == false) {
		  $this->load();
		  $this->loadParent();
		}
	}
	
	
	/**
	 * Загружает из БД или кэша дефиницию поля
	 *
	 * @return array
	 */
	public function load ()
	{
		$cached = $this->ctx->cache->fromDump("document_types/" . $this->type , 7200);
		
		if($cached != CACHE_DUMP_NOT_EXISTS) {
			$row = &$cached;
		} else {
		
		  $result = $this->ctx->db->query("SELECT * FROM " . $this->rh->db_prefix . "document_types WHERE type_name = " . $this->ctx->db->quote($this->type) , 1);
		
		  if($result && $db->getNumRows($result)) {
			  $row = $db->fetchAssoc($result);
		  } else {
		  	$row = false;
		  }
		}
		
		// если загрузили, то кэшируем
		if($row != false) {
			$this->is_abstract = $row["is_abstract"];
			$this->title = $row["title"];
			$this->parent_type = $row["parent_type"];
			
			if($row["config"] instanceof RL_DocumentTypeConfig) {
				$this->config = $row["config"];
			} else {
				// парсим конфиг, если он не кэшировался
				$this->config = new RL_DocumentTypeConfig();
				$this->config->parseConfig( $row["fields_config"] );
				
				$row["config"] = $this->config;
			}
		}
		
		$this->ctx->cache->dump("document_types/" . $this->type , $row , 7200);
		
		return $row;
	}
	
	/**
	 * Загружает родительский тип (и его родительские, если надо)
	 *
	 * @return void
	 */
	private function loadParent()
	{
		$parent_type = $this->parent_type;
		while($parent_type != "") {
			$parent = new RL_DocumentType( $this->rh , $parent_type , true);
			$parent->load();
			// мержим конфиги
			$this->config->mergeWithParent( $parent->config );
			
			$parent_type = $parent->parent_type;
		}
	}
}
